/**
 * describe:
 *
 * @author chaP
 * @date 2019/03/12
 */
package CodingTest.AC20190312;

/**
 * 题目描述(正则表达式)
 请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符，
 而'*'表示它前面的字符可以出现任意次（包含0次）。 在本题中，匹配是指字符串的所有字符匹配整个模式。
 例如，字符串"aaa"与模式"a.a"和"ab*ac*a"匹配，但是与"aa.a"和"ab*a"均不匹配

 思路：当模式中的第二个字符不是“*”时：
 1、如果字符串第一个字符和模式中的第一个字符相匹配，那么字符串和模式都后移一个字符，然后匹配剩余的。
 2、如果 字符串第一个字符和模式中的第一个字符相不匹配，直接返回false。

 而当模式中的第二个字符是“*”时：
 如果字符串第一个字符跟模式第一个字符不匹配，则模式后移2个字符，继续匹配。如果字符串第一个字符跟模式第一个字符匹配，可以有3种匹配方式：
 1、模式后移2字符，相当于x*被忽略；
 2、字符串后移1字符，模式后移2字符；
 3、字符串后移1字符，模式不变，即继续匹配字符下一位，因为*可以匹配多位；
 */
public class Match {
    public boolean Match(char[] str,char[] pattern){
    int strindex = 0;
    int patindex = 0;
    int strlen = str.length;
    if(str.length == 0&&pattern.length == 0)return true;
     return solution(strindex,patindex,str,pattern);
    }
    public boolean solution(int strindex,int patindex,char[] str,char[] pattern){
        if(strindex == str.length&&patindex == pattern.length){
            return true;
        }
        if(patindex == pattern.length&&strindex!=str.length){
            return false;
        }
        //pattern模式第二字符为"*"，
        if( patindex+1<pattern.length && pattern[patindex+1] == '*'){
            //str第一个字符与pattern第一个字符相同
            if((strindex != str.length&&str[strindex] == pattern[patindex])||(pattern[patindex] == '.'&&strindex != str.length)){
            return solution(strindex,patindex+2,str,pattern)
                    ||solution(strindex+1,patindex,str,pattern)
                    ||solution(strindex+1,patindex+2,str,pattern);
        }else{
                return solution(strindex,patindex+2,str,pattern);
            }

        }
        //pattern模式第二字符不为'*'
        if((strindex!=str.length&& pattern[patindex] ==str[strindex])||(pattern[patindex] == '.' &&strindex!=str.length)){
            return solution(strindex+1,patindex+1,str,pattern);
            }
            return false;
        }

    public static void main(String[] args) {
//        char b[] = null完成了b的初始化，但是没有分配内存。
        char[] str = {'a'};
        char[] pattern = {'.'};
        Match m = new Match();
        System.out.println(m.Match(str,pattern));
    }}

